// 在api中的js中，向后端发送axios异步请求

/*
（1）第一步：导入axios实例
@ 符号在build/webpack.base.conf.js 中配置 表示 'src' 路径
在src/utils/request，已经初始化了axios实例
--------------------------------------------------------
request只是一个变量名，表示要引入的工具类的js文件的名称
*/
import request from '@/utils/request'

/*
（2）第二步：编写api访问模块
针对要访问的后端接口封装请求路径、请求方法【讲师的CRUD】
并将其导出
*/
export default{
  // 讲师的CRUD

  /*
   1、查询所有讲师列表
   --------------------------------------------------------
    ① export default{}，表示将里面的所有函数、变量导出
    ② teacherList(){}，是teacherList:function(){}的简写
      表示function(){}
    ③ request()，表示调用的是request里面的方法
      request({})，表示在里面配置参数【请求路径、请求方法、请求参数等】
      向后端发送请求成功后，得到响应对象
    ④ return，是返回响应对象，这样页面组件xxx.vue就可以对它进行调用
  */
  teacherList() {
    return request({
      url: '/admin/edu/teacher/list',
      method: 'get'
    })
  },

  /*
   2、带条件分页查询讲师列表
   ---------------------------------------------------------------------------------------
   传参分析：
   （1）后端的TeacherController分页查询接口：
   "/listPageByTeacherQuery/{current}/{size}"
   并且在方法的形参上，使用了：
   @PathVariable Long current、@PathVariable Long size
   来接收前端的参数
   也就是说，在前端发送请求的时候，需要传递：
   current【当前页码】、size【每页记录数】，并且需要在url路径中携带
   所以，在方法中，定义两个形参：teacherPage(current, size)
   当页面【也就是list.vue】在调用teacherPage(current, size)方法时，会传实参进来【谁调谁传参】
   而请求路径就是：
   /admin/edu/teacher/listPageByTeacherQuery/${current}/${size}
   ${current}、${size}是动态获取teacherPage(current, size)里面的两个形参
   也就是说，当list.vue调用teacherPage()方法时，会传两个实参进来，然后url就会通过${current}、
   ${size}动态获取到参数
   这样，在向后端发送请求时，请求路径url上，就会携带两个参数，给后端发送请求
   ---------------------------------------------------------------------------------------
   （2）但是只传current【当前页码】、size【每页记录数】，是不带条件的分页查询
   要想分页查询，还得将用户填写的查询条件封装，一起发送给后端
   而在后端的TeacherController分页查询接口的方法形参，还有使用了一个POJO对象来接收查询条件：
   TeacherQuery teacherQuery
   也就是说，list.vue调用teacherPage()方法时，还得再添加一个参数：查询条件
   所以，teacherPage(current, size)，就要改成teacherPage(current, size，teacherQuery)
   但是，后端是使用pojo来接收参数的，所以前端需要在请求参数中传参，也就是url路径中拼接参数：
   get：url?k=v&k2=v2
   post: url?k=v&k2=v2【不过post请求参数拼接后存在请求体中】
   而axios中，
   使用params，会自动将后面对象的Key-Value，拼接到url路径后面
   使用data，会将后面对象以json字符串的方式使用请求体提交
   很明显，后端只使用了pojo对象来接收，并没有加上@RequestBody注解，所以是在请求参数中传参
  */
  teacherPage(current, size, teacherQuery) {
    return request({
      // 要使用ES6的模板字符串【也就是反单引号``】
      url: `/admin/edu/teacher/listPageByTeacherQuery/${current}/${size}`,
      method: 'get',
      params: teacherQuery // axios会自动拼接参数到url路径后使用
      // data: teacherQuery  将teacherQuery对象以json字符串的方式使用请求体提交
    })
  },

  /*
  3、新增讲师
  ---------------------------------------------
  后端的TeacherController新增接口：
  使用的是@RequestBody Teacher teacher 来接收参数
  所以前端要在请求体中使用json对象来传参
  所以此处不能用params: teacher
  而是要用data: teacher
  ---------------------------------------------
  teacherSave(teacher)表示为方法添加形参
  当页面form.vue调用这个方法时，
  会传一个teacher对象进来
  */
  teacherSave(teacher) {
    return request({
      url: '/admin/edu/teacher/save',
      method: 'post',
      data: teacher
    })
  },

  /*
  4、根据id删除讲师
  ------------------------------------------------------------
  后端的TeacherController删除接口的映射路径是：/remove/{id}
  而且在方法的形参中，使用@PathVariable String id 来接收前端参数
  这就意味着，前端在发送axios异步请求时，需要在url路径中传参
  teacherDelete(id)，只是提供一个形参，当页面lite.vue调用它时，
  会传一个参数进来
  而${id}取得是teacherDelete(id)里面的参数，也就是页面lite.vue传进来
  的参数，然后放在url路径中，发送给后端
  */
  teacherDelete(id) {
    return request({
      url: `/admin/edu/teacher/remove/${id}`,
      method: 'delete'
    })
  },

  /*
  5、根据多个id【id列表】，批量删除讲师
  ---------------------------------------------------------------------
  后端的TeacherController删除接口的映射路径是：/batchRemove
  而且在方法的形参中，使用@RequestBody List<String> idList 来接收前端参数
  所以，前端要在请求体中使用json对象来传参
  所以，此处不能用params: idList
  而是要用data: idList
  ---------------------------------------------------------------------
  teacherBatchDelete(idList)表示为方法添加形参idList
  当页面list.vue调用这个方法时，
  会传一个idList列表进来
  然后传给data: idList，传给后端
  */
  teacherBatchDelete(idList) {
    return request({
      url: '/admin/edu/teacher/batchRemove',
      method: 'delete',
      data: idList
    })
  },

  /*
  6、根据id查询讲师
  --------------------------------------------------------------------------
  后端的TeacherController根据id查询讲师的映射路径是：@PostMapping("/get/{id}")
  在方法的形参中，使用@PathVariable("id") String id 来接收前端参数
  --------------------------------------------------------------------------
  所以，这就意味着，前端在发送axios异步请求时，需要在url路径中传参
  */
  getTeacherById(id) {
    return request({
      url: `/admin/edu/teacher/get/${id}`,
      method: 'post'
    })
  },

  /*
  7、更新讲师
   --------------------------------------------------------------------------
  后端的TeacherController更新讲师的映射路径是：@PutMapping("update")
  在方法的形参中，使用@RequestBody Teacher teacher 来接收前端参数
  --------------------------------------------------------------------------
  所以，前端要在请求体中使用json对象来传参
  所以，此处不能用params: teacher
  而是要用data: teacher
  */
  updateTeacher(teacher) {
    return request({
      url: '/admin/edu/teacher/update',
      method: 'put',
      data: teacher
    })
  }
}
